Java ARchive (JAR) ファイルの署名を生成し、署名付き JAR ファイルの署名を検証します。
jarsigner [ options ] jar-file alias jarsigner -verify [ options ] jar-file
jarsigner ツールは、次の 2 つの目的で使用します。
- Java ARchive (JAR) ファイルに署名を付ける
- 署名付き JAR ファイルの署名と整合性を検証する
JAR 機能を使うと、クラスファイル、イメージ、サウンド、およびその他のデジタルデータを単一のファイルにパッケージ化できるので、ファイルを迅速かつ容易に配布できます。開発者は、jar という名前のツールを使って JAR ファイルを作成できます。技術的な観点から言えば、すべての ZIP ファイルも JAR ファイルとみなすことができます。 ただし、jar によって作成された JAR ファイル、または jarsigner によって処理された JAR ファイルには、META-INF/MANIFEST.MF ファイルが含まれています。
「デジタル署名」は、なんらかのデータ (「署名」の対象となるデータ) と、エンティティー (人、会社など) の非公開鍵とに基づいて計算されるビット列です。手書きの署名同様、デジタル署名には多くの利点があります。
- 署名の生成に使われた非公開鍵と対になる公開鍵を使って計算を行うことで、デジタル署名が本物かどうかを検証できる
- 非公開鍵が他人に知られない限り、デジタル署名の偽造は不可能である
- デジタル署名は、その署名が付いたデータだけを対象とするものであり、ほかのデータの署名として機能することはない
- 署名付きのデータは変更できない。 データが変更された場合は、その署名によってデータが本物ではないことが検証される
ファイルに対してエンティティーの署名を生成するには、まず、エンティティーは、そのエンティティーに関連する公開鍵と非公開鍵のペアを持つ必要があります。 また、公開鍵を認証する 1 つまたは複数の証明書も必要です。「証明書」とは、あるエンティティーが発行したデジタル署名付きの文書で、別なエンティティーの公開鍵が特定の値であることを証明しています。
jarsigner は、「キーストア」に含まれる鍵と証明書情報を使って、JAR ファイルのデジタル署名を生成します。キーストアは、非公開鍵と、非公開鍵に関連付けられた X.509 証明書チェーンが収められたデータベースです。キーストアの作成と管理には、keytool ユーティリティーを使います。
jarsigner は、エンティティーの非公開鍵を使って署名を生成します。署名付き JAR ファイルには、ファイルの署名に使用する非公開鍵に対応する公開鍵を保存するキーストアからとった証明書のコピーも含まれています。 jarsigner は、署名付き JAR ファイルのデジタル署名を、ファイル内 (の署名ブロックファイル) に含まれている証明書を使って検証することができます。
5.0 以降では、jarsigner はタイムスタンプを含む署名を生成するので、システムやデプロイヤ (Java Plug-in を含む) はJAR ファイルが署名証明書の有効期間中に署名されたかどうかをチェックできます。さらに、5.0 で追加された API を使用して、アプリケーションはタイムスタンプ情報を取得できます。
現時点では、jarsigner で署名できるのは、JDK の jar ツールで作成された JAR ファイル、または ZIP ファイルだけです。JAR ファイルは ZIP ファイルと同じですが、JAR ファイルには META-INF/MANIFEST.MF ファイルが含まれている点が異なります。META-INF/MANIFEST.MF ファイルは、jarsigner が ZIP ファイルに署名を付けるときに自動的に作成されます。
デフォルトでは、jarsigner は JAR (または ZIP) ファイルに「署名」を付けます。署名付き JAR ファイルを「検証」する場合は、
-verify
オプションを指定します。
keytool ツールと jarsigner ツールは、JDK 1.1 で提供されていた javakey ツールを完全に置き換えるものです。これらの新しいツールは javakey よりも多くの機能を備えており、キーストアと非公開鍵をパスワードで保護する機能や、署名の生成に加えて署名を検証する機能を持っています。
新しいキーストアアーキテクチャーは、javakey が作成して管理していたアイデンティティーデータベースに代わるものです。キーストア形式と、JDK 1.1 の javakey が使っていたデータベース形式との間には下位互換性はありません。ただし、次のようなことは可能です。
- keytool の
-identitydb
コマンドを使うと、アイデンティティーデータベースの情報をキーストアにインポートできます。- jarsigner は、以前に javakey を使って署名された JAR ファイルに署名を付けることができます。
- jarsigner は、javakeyを使って署名された JAR ファイルを検証できます。したがって、jarsigner は、Java 2 SDK のキーストアではなく JDK 1.1 のアイデンティティーデータベースからの署名者別名を認識し、これらを対象に処理を行うことができます。
次の表は、JDK 1.1.x で署名された JAR ファイルが、Java 2 プラットフォームでどのように扱われるかを示しています。
JAR ファイルのタイプ
1.1 データベース内のアイデンティティー
1.1 データベースから Java 2 Platform キーストアにインポートされる信頼できるアイデンティティー (4)
ポリシーファイルがアイデンティティー/別名に特権を与える
与えられる特権
署名付き JAR
なし
なし
なし
すべてのコードに与えられるデフォルトの特権
署名のない JAR
なし
なし
なし
すべてのコードに与えられるデフォルトの特権
署名付き JAR
なし
あり
なし
すべてのコードに与えられるデフォルトの特権
署名付き JAR
あり/信頼できない
なし
なし
すべてのコードに与えられるデフォルトの特権 (3)
署名付き JAR
あり/信頼できない
なし
あり
すべてのコードに与えられるデフォルトの特権 (1,3)
署名付き JAR
なし
あり
あり
すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権
署名付き JAR
あり/信頼できる
あり
あり
すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権 (2)
署名付き JAR
あり/信頼できる
なし
なし
すべての特権
署名付き JAR
あり/信頼できる
あり
なし
すべての特権 (1)
署名付き JAR
あり/信頼できる
なし
あり
すべての特権 (1)
注 -
- ポリシーファイル内にアイデンティティー/別名についての言及がある場合、それをキーストアにインポートして、ポリシーファイルの設定が与えられた特権に反映されるようにする必要があります。
- ポリシーファイル/キーストアの組み合わせは、アイデンティティーデータベース内の信頼できるアイデンティティーよりも優先されます。
- Java 2 プラットフォームでは、信頼できないアイデンティティーは無視されます。
- Java 2 SDK キーストアにインポートできるのは、信頼できるアイデンティティーだけです。
キーストアの別名
キーストアのすべてのエントリは、一意の「別名」を介してアクセスされます。
jarsigner を使って JAR ファイルに署名を付けるときは、署名の生成に必要な非公開鍵を含むキーストアエントリの別名を指定する必要があります。たとえば、次の例は、working ディレクトリの mystore という名前のキーストアに含まれる別名 duke に関連付けられた非公開鍵を使って、MyJARFile.jar という名前の JAR ファイルに署名を付けます。出力ファイルは指定されていないので、MyJARFile.jar は署名付きの JAR ファイルによって上書きされます。
jarsigner -keystore /working/mystore -storepass myspass -keypass dukekeypasswd MyJARFile.jar dukeキーストアはパスワードで保護されているので、ストアのパスワード (上の例では mypass) を指定する必要があります。コマンド行でストアのパスワードを指定しないと、パスワードの入力を求められます。同様に、非公開鍵もキーストア内でパスワードによって保護されているため、非公開鍵のパスワード (上の例では dukekeypasswd) を指定する必要があります。 コマンド行で非公開鍵のパスワードを指定していない、また、指定したパスワートが保存されているパスワードと違っている場合には、非公開鍵のパスワードの入力を求められます。
キーストアの場所
jarsigner には、使用するキーストアの URL を指定する
-keystore
オプションがあります。キーストアは、デフォルトではユーザーのホームディレクトリの.keystore
という名前のファイルに格納されます。 ユーザーのホームディレクトリは、user.home
システムプロパティーによって決まります。Solaris システムの場合、user.home
がデフォルトでユーザーのホームディレクトリになっています。
-keystore
オプションからの入力ストリームは、KeyStore.load
メソッドに渡されます。URL としてNONE
が指定されている場合は、null のストリームがKeyStore.load
メソッドに渡されます。NONE
は、KeyStore
がファイルベースではなく、たとえば、ハードウェアトークンデバイスに置かれている場合に指定します。キーストアの実装
java.security
パッケージで提供されるKeyStore
クラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。キーストアの固定実装としては、それぞれが特定の「タイプ」のキーストアを対象とする複数の異なる実装が存在可能です。現在、キーストアの実装を使用するものとして、keytool と jarsigner の 2 つのコマンド行ツールと、Policy Tool という名前の 1 つの GUI ベースのツールがあります。
KeyStore
は public として使用可能なので、Java 2 SDK ユーザーは KeyStore を使ったほかのセキュリティーアプリケーションも作成できます。キーストアには、Sun が提供する組み込みのデフォルトの実装があります。これは、JKS という名前の独自のキーストアタイプ (形式) を利用するもので、キーストアをファイルとして実装しています。この実装では、個々の非公開鍵は個別のパスワードによって保護され、キーストア全体の整合性も (非公開鍵とは別の) パスワードによって保護されます。
キーストアの実装は、プロバイダベースです。具体的には、
KeyStore
が提供するアプリケーションインタフェースは、Service Provider Interface (SPI) という形で実装されています。つまり、対応するKeystoreSpi
抽象クラス (これもjava.security
パッケージに含まれている) があり、このクラスが Service Provider Interface のメソッドを定義しています。 これらのメソッドは、「プロバイダ」が実装しなければなりません。ここで、「プロバイダ」とは、Java Security API によってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。したがって、キーストアの実装を提供するには、「Java 暗号化アーキテクチャー用プロバイダの実装方法」で説明しているように、クライアントが「プロバイダ」を実装し、KeystoreSpi サブクラスの実装を提供する必要があります。アプリケーションでは、
KeyStore
クラスが提供する getInstance ファクトリメソッドを使うことで、さまざまなプロバイダから異なる「タイプ」のキーストアの実装を選択できます。キーストアのタイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開鍵とキーストア自体の整合性を保護するために使われるアルゴリズムを定義します。異なるタイプのキーストアの実装には、互換性はありません。keytool は、任意のファイルベースのキーストア実装で動作します。keytool は、コマンド行から渡されたキーストアの場所をファイル名として扱い、これを FileInputStream に変換して、FileInputStream からキーストアの情報をロードします。一方、jarsigner ツールと policytool ツールは、URL で指定可能な任意の場所からキーストアを読み込むことができます。
jarsigner と keytool の場合、-storetype オプションを使ってコマンド行でキーストアのタイプを指定できます。Policy Tool の場合は、[Edit] メニューの [Change Keystore] コマンドを使ってキーストアのタイプを指定できます。
キーストアのタイプを明示的に指定しない場合、keytool、jarsigner、および policytool の各ツールは、セキュリティープロパティーファイル内で指定された
keystore.type
プロパティーの値に基づいてキーストアの実装を選択します。セキュリティープロパティーファイルは、java.security という名前で SDK セキュリティープロパティーディレクトリjava.home/lib/security
に置かれています。 java.home は、実行環境のディレクトリ (SDK の jre ディレクトリまたは Java 2 Runtime Environment の最上位のディレクトリ) です。各ツールは、
keystore.type
の値を取得し、この値で指定されたタイプのキーストアを実装しているプロバイダが見つかるまで、現在インストールされているすべてのプロバイダを調べます。目的のプロバイダが見つかると、そのプロバイダからのキーストアの実装を使います。
KeyStore
クラスではgetDefaultType
という名前の static メソッドが定義されており、アプリケーションとアプレットはこのメソッドを使うことでkeystore.type
プロパティーの値を取得できます。次のコードは、デフォルトのキーストアタイプ (keystore.type
プロパティーで指定されたタイプ) のインスタンスを生成します。KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());デフォルトのキーストアタイプは JKS (Sun が提供する独自のタイプのキーストアの実装) です。これは、セキュリティープロパティーファイル内の次の行によって指定されています。
keystore.type=jks注:キーストアのタイプの指定では、大文字と小文字は区別されません。たとえば、JKS と jks は同じものとして扱われます。
各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。たとえば、pkcs12 と呼ばれるタイプのキーストアの実装を提供しているプロバイダパッケージを使用するには、上の行を次のように変更します。
keystore.type=pkcs12PKCS#11 プロバイダパッケージを使用する場合、その詳細については、「Java PKCS#11 Reference Guide」にある「KeyTool and JarSigner」の節を参照してください。
デフォルトでは、jarsigner は次のどちらかのアルゴリズムを使って JAR ファイルに署名します。
- SHA-1 ダイジェストアルゴリズムを使った DSA (デジタル署名アルゴリズム)
- MD5 ダイジェストアルゴリズムを使った RSA アルゴリズム
具体的には、署名者の公開鍵と非公開鍵が DSA 鍵である場合、jarsigner は SHA1withDSA アルゴリズムを使って JAR ファイルに署名を付けます。署名者の鍵が RSA 鍵である場合、jarsigner は MD5withRSA アルゴリズムを使って JAR ファイルに署名を付けます。
これらのデフォルトの署名アルゴリズムは、-sigalg オプションを使ってオーバーライドできます。
jarsigner を使って JAR ファイルに署名を付けた場合、出力される署名付き JAR ファイルは入力 JAR ファイルと同じですが、次の 2 つの追加ファイルが META-INF ディレクトリに置かれる点が異なります。
- .SF 拡張子の付いた署名ファイル
- .DSA 拡張子の付いた署名ブロックファイル
これら 2 つのファイルのベースファイル名は、
-sigFile
オプションの値から作成されます。たとえば、次のようにオプションを指定したとします。-sigFile MKSIGNこの場合、ファイル名はそれぞれ MKSIGN.SF と MKSIGN.DSA になります。
コマンド行で
-sigfile
オプションを指定しなかった場合、.SF ファイルと .DSA ファイルのベースファイル名は、コマンド行で指定された別名の先頭の 8 文字をすべて大文字に変換したものになります。別名が 8 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。使用できる文字は、アルファベット、数字、下線 (_)、ハイフンです。署名 (.SF) ファイル
署名ファイル (.SF ファイル) は、jarsigner で署名を付けた JAR ファイルに常に含まれるマニフェストファイルと似ています。つまり、マニフェストファイル同様、.SF ファイルには、JAR ファイルに含まれているソースファイルごとに、次の 3 つの行があります。
- ファイル名
- 使われているダイジェストアルゴリズム (SHA) の名前
- SHA ダイジェストの値
マニフェストファイルでは、SHA ダイジェストの値は、ソースファイルのバイナリデータのダイジェスト (ハッシュ) です。一方、.SF ファイルでは、ソースファイルのダイジェストの値は、マニフェストファイル中の該当するソースファイルに対応する 3 行のハッシュです。
署名ファイルには、デフォルトでマニフェストファイル全体のハッシュも含まれています。後述の「JAR ファイルの検証」で説明するように、このヘッダーの存在によって検証の最適化が可能になっています。
署名ブロック (.DSA) ファイル
.SF ファイルには署名が付けられ、署名は .DSA ファイルに置かれます。.DSA ファイルには、キーストアからの証明書または証明書チェーンも符号化された形で含まれています。 証明書または証明書チェーンは、署名に使われた非公開鍵に対応する公開鍵を認証します。
J2SE 5.0 リリースの
jarsigner
ツールは、JAR ファイルの署名時に署名タイムスタンプを生成および格納できるようになりました。さらに、jarsigner
は代替署名機構をサポートします。この動作は省略可能で、署名時に次の各オプションによって制御されます。これらの各オプションの詳細については、後述の「オプション」節を参照してください。
JAR ファイルの検証が成功するのは、署名が有効であり、かつ署名の生成以後に JAR ファイル内のどのファイルも変更されていない場合です。JAR ファイルの検証は、次の手順で行われます。
- .SF ファイルそれ自体の署名を検証します。
この手順では、各署名ブロック (.DSA) ファイルに格納されている署名が、実際に、公開鍵に対応する非公開鍵を使って生成されたものであることを確認します。 .DSA ファイルには、公開鍵の証明書 (または証明書チェーン) も含まれています。また、この手順では、目的の署名が、対応する署名 (.SF) ファイル内の有効な署名であるかどうかを調べ、.SF ファイルが改変されていないことも確認します。
- .SF ファイル内の各エントリのダイジェストをマニフェスト内の対応する各セクションと突き合わせて検証します。
.SF ファイルには、マニフェストファイル全体のハッシュが格納されたヘッダーがデフォルトで含まれています。このヘッダーが存在する場合は、ヘッダー内のハッシュが実際にマニフェストファイルのハッシュと一致するかどうかを検証することができます。ハッシュが一致する場合は、次の手順に進みます。
ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。 具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します (「署名 (.SF) ファイル」を参照)。
.SF ファイルのヘッダーに格納されたマニフェストファイルのハッシュと、実際のマニフェストファイルのハッシュとが一致しない場合は、署名 (および .SF ファイル) の生成後に、JAR ファイルに 1 つ以上のファイルが追加 (
jar
ツールを使用) された可能性があります。jar
ツールを使ってファイルを追加した場合、マニフェストファイルは変更されますが (新しいファイル用のセクションが追加される)、.SF ファイルは変更されません。この場合、.SF ファイルのヘッダー以外のセクションに格納されたハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するときは、署名の生成時に JAR ファイル内に存在していたファイルのうち、どのファイルも変更されていないことになり、検証は成功したものとして扱われます。- JAR ファイル内のファイルのうち、.SF ファイル内にエントリを持つ各ファイルを読み込みます。読み込み中にファイルのダイジェストを計算し、結果をマニフェストセクション内の該当するファイルのダイジェストと比較します。2 つのダイジェストは同じでなければならず、そうでない場合は検証が失敗します。
検証プロセスの途中でなんらかの重大な検証エラーが発生した場合、検証プロセスは中止され、セキュリティー例外がスローされます。スローされたセキュリティー例外は、jarsigner がキャッチして表示します。
1 つの JAR ファイルに対して jarsigner ツールを複数回実行し、実行のたびに、異なるユーザーの別名を指定すれば、JAR ファイルに複数のユーザーの署名を付けることができます。
jarsigner myBundle.jar susan jarsigner myBundle.jar kevinJAR ファイルが複数回署名されている場合、その JAR ファイルには .SF ファイルと .DSA ファイルの対が複数含まれることになります。 .SF ファイルと .DSA ファイルの対は、1 回の署名に対して 1 つ作成されます。したがって、上の例で出力される JAR ファイルには、次の名前を持つファイルが含まれます。
SUSAN.SF SUSAN.DSA KEVIN.SF KEVIN.DSA注:JAR ファイルでは、JDK 1.1 の javakey ツールで生成された署名と jarsigner で生成された署名が混在できます。つまり、すでに javakey を使って署名が付けられている JAR ファイルに、jarsigner を使って署名を付けることができます。
以下では、jarsigner のオプションについて説明します。注:
- どのオプション名にも先頭にマイナス記号 (-) が付く
- オプションは任意の順序で指定できる
- イタリック体の項目の実際の値 (オプションの値) は、ユーザーが指定する必要がある
-keystore
、-storepass
、-keypass
、-sigfile
、-sigalg
、-digestalg
および-signedjar
の各オプションを使用できるのは、JAR ファイルに署名を付ける場合だけである。 これらのオプションは、JAR ファイルを検証する場合には使用できない。同様に、別名をコマンド行で指定するのは、JAR ファイルに署名を付ける場合だけである
-keystore
url- キーストアの場所を示す URL を指定します。デフォルトは、ユーザーのホームディレクトリ内のファイル .keystore です。 ユーザーのホームディレクトリは、user.home システムプロパティーによって決まります。
署名するときはキーストアが必要です。 このため、デフォルトのキーストアが存在しない場合、あるいはデフォルト以外のほかのキーストアを使用する場合は、キーストアを明示的に指定する必要があります。
検証するときはキーストアは必要ありません。 ただし、キーストアが指定されているか、あるいはデフォルトのキーストアが存在していて、さらに
-verbose
オプションも指定されている場合は、JAR ファイルの検証に使われる証明書がキーストアに存在するかどうかについての追加情報が出力されます。注:
-keystore
の引数には、URL の代わりにファイル名 (とパス) を指定できます。 ファイル名 (とパス) を指定した場合は、「file:」URL として扱われます。たとえば、次のように指定できます。-keystore filePathAndNameこれは、次の指定と同じものとして扱われます。-keystore file:filePathAndNameJRE の $JAVA_HOME/lib/security ディレクトリに格納された java.security セキュリティープロパティーファイル内で Sun PKCS#11 プロバイダが設定されている場合、keytool と jarsigner は PKCS#11 トークンに基づいて動作できます。 次のオプションを指定します。たとえば、次のコマンドは、設定された PKCS#11 トークンの内容を一覧表示します。
-keystore NONE
-storetype PKCS11
jarsigner -keystore NONE -storetype PKCS11 -list-storetype
storetype- インスタンスを生成するキーストアのタイプを指定します。デフォルトのキーストアタイプは、セキュリティープロパティーファイル内の keystore.type プロパティーの値で指定されたタイプです。 この値は、
java.security.KeyStore
の staticgetDefaultType
メソッドで取得できます。
-storepass
オプションを使って PCKS#11 トークンの PIN を指定することもできます。何も指定しなかった場合、keytool と jarsigner はユーザーにトークン PIN の 入力を求めます。トークンに保護された認証パス (専用の PIN パッドや生体読み取り機など) がある場合、-protected オプションを指定する必要がありますが、パスワードオプションを指定する必要はありません。-storepass
password- キーストアにアクセスするのに必要なパスワードを指定します。このオプションが必要なのは、JAR ファイルに署名を付けるときだけです (JAR ファイルを検証するときは不要)。署名を付けるときに、コマンド行で
-storepass
オプションを指定しなかった場合は、パスワードの入力を求められます。注:テストを目的とする場合、またはセキュリティー保護されたシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。また、password プロンプトでパスワードを入力すると、入力したパスワードがエコーされ、そのまま画面に表示されます。 このため、周囲にほかのユーザーがいる場合は、パスワードを見られないように注意してください。
-keypass
password- コマンド行で指定された別名に対応するキーストアエントリの非公開鍵を保護するのに使うパスワードを指定します。jarsigner を使って JAR ファイルに署名を付けるときは、パスワードが必要です。コマンド行でパスワードが指定されておらず、必要なパスワードがストアのパスワードと異なる場合は、パスワードの入力を求められます。
注:テストを目的とする場合、またはセキュリティー保護されたシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。また、password プロンプトでパスワードを入力すると、入力したパスワードがエコーされ、そのまま画面に表示されます。 このため、周囲にほかのユーザーがいる場合は、パスワードを見られないように注意してください。
-sigfile
file- .SF ファイルと .DSA ファイルの生成に使うベースファイル名を指定します。たとえば、file に DUKESIGN を指定すると、生成される .SF ファイルと .DSA ファイルの名前は、それぞれ DUKESIGN.SF と DUKESIGN.DSA になります。 これらのファイルは、署名付き JAR ファイルの META-INF ディレクトリに置かれます。
file に使用できる文字は「a-zA-Z0-9_-」です。つまり、文字、数字、下線、およびハイフンだけを使用できます。注:.SF および .DSA のファイル名では、小文字はすべて大文字に変換されます。
コマンド行で
-sigfile
オプションを指定しなかった場合、.SF ファイルと .DSA ファイルのベースファイル名は、コマンド行で指定された別名の先頭の 8 文字をすべて大文字に変換したものになります。別名が 8 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。-sigalg
algorithmJAR ファイルの署名に使用する署名アルゴリズムの名前を指定します。標準署名アルゴリズム名の一覧については、「Java Cryptography Architecture」にある 「Appendix A 」を参照してください。このアルゴリズムは、JAR ファイルの署名に使用する秘密鍵と互換性のあるものでなければなりません。このオプションを指定しなかった場合、秘密鍵のタイプに応じて SHA1withDSA、MD5withRSA のいずれかが使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、あるいはユーザーがそのようなプロバイダを -providerClass オプションを使って指定する必要があります。 そうでない場合、コマンドの実行が失敗します。
-digestalg
algorithmJAR ファイルのエントリをダイジェストする際に使用するメッセージダイジェストアルゴリズムの名前を指定します。標準メッセージダイジェストアルゴリズム名の一覧については、「Java Cryptography Architecture」にある 「Appendix A 」を参照してください。このオプションを指定しなかった場合、SHA-1 が使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、あるいはユーザーがそのようなプロバイダを -providerClass オプションを使って指定する必要があります。 そうでない場合、コマンドの実行が失敗します。
-signedjar
file- 署名付き JAR ファイルの名前を指定します。
コマンド行で名前を指定しなかった場合は、入力 JAR ファイル (署名の対象となる JAR ファイル) の名前と同じ名前が使われます。 この場合、入力 JAR ファイルは署名付き JAR ファイルによって上書きされます。
-verify
- コマンド行でこのオプションが指定されている場合は、指定された JAR ファイルが検証されます。JAR ファイルへの署名は行われません。 検証が成功すると、「jar が検証されました。」 というメッセージが表示されます。署名されていない JAR ファイル、またはサポートされていないアルゴリズム (RSA プロバイダのインストールを終了していない場合の RSA など) を使って署名された JAR ファイルを検証しようとすると、「jar は署名されていません。(署名が見つからないか、構文解析できません)」というメッセージが表示されます。
署名付き JAR ファイルは、jarsigner または JDK 1.1 の javakey ツール、あるいはその両方を使って検証できます。
検証についての詳細は、「JAR ファイルの検証」を参照してください。
-certs
- コマンド行で、
-verify
および-verbose
オプションとともにこのオプションが指定されている場合は、JAR ファイルの各署名者の証明書情報も出力されます。証明書情報には次のものが含まれます。
- 署名者の公開鍵を証明する (.DSA ファイルに格納された) 証明書の種類の名前
- 証明書が X.509 証明書 (つまり、
java.security.cert.X509Certificate
のインスタンス) である場合は、署名者の識別名キーストアの確認も行われます。コマンド行でキーストアの値が指定されていない場合、デフォルトのキーストアファイルがあれば、検査されます。署名者の公開鍵の証明書がキーストア内のエントリと一致した場合は、次の情報も表示されます。
- 署名者に該当するキーストアエントリの別名。 この別名は括弧で囲まれます。ただし、キーストアではなく JDK 1.1 のアイデンティティーデータベースに由来する署名者の場合は、括弧ではなく大括弧で囲まれます。
-verbose
- コマンド行でこのオプションが指定されている場合、jarsigner は「冗長」モードで動作し、JAR の署名または検証の進行状況に関する追加情報を出力します。
-internalsf
- 以前は、JAR ファイルの署名時に生成された .DSA (署名ブロック) ファイルの中に、生成された .SF ファイル (署名ファイル) の完全なコピーが符号化された形で含まれていました。この動作は変更されました。この動作は変更になり、現在では、出力 JAR ファイル全体のサイズを小さくするために、デフォルトでは .SF ファイルが .DSA ファイルに含まれないようになっています。ただし、コマンド行で
-internalsf
オプションを指定すると、以前と同じように動作します。このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。 このオプションを使用すると、有益な最適化が行われなくなります。-sectionsonly
- コマンド行でこのオプションが指定されている場合、JAR ファイルの署名時に生成される .SF ファイル (署名ファイル) には、マニフェストファイル全体のハッシュを含むヘッダーは追加されません。この場合、.SF ファイルに含まれるのは、JAR ファイル内の各ソースファイルに関する情報およびハッシュだけです。 詳細は、「署名 (.SF) ファイル」を参照してください。
デフォルトでは、最適化を行うために、マニフェストファイル全体のハッシュを含むヘッダーが追加されます。ヘッダーが存在する場合は、JAR ファイルの検証時に、まずヘッダー内のハッシュが、マニフェストファイル全体のハッシュと実際に一致するかどうかが確認されます。ハッシュが一致する場合、検証は次の手順に進みます。ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。 具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します。
詳細は、「JAR ファイルの検証」を参照してください。
このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。 このオプションを使用すると、有益な最適化が行われなくなります。
-protected
true
またはfalse
のいずれか。専用 PIN リーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合には、この値にtrue
を指定してください。-provider
provider-class-nameサービスプロバイダがセキュリティープロパティーファイル (java.security) のリストに入っていないときに、暗号化サービスプロバイダのマスタークラスファイルの名前を指定します。
-providerArg
ConfigFilePath オプションと組み合わせて使用します。 keytool と jarsigner はプロバイダを動的にインストールします (ここで、ConfigFilePath はトークン設定ファイルへのパスです)。セキュリティープロパティーファイル内で Sun PKCS#11 プロバイダが設定されていない場合に PKCS#11 キーストアを一覧表示するコマンドの例を次に示します。jarsigner -keystore NONE -storetype PKCS11 \ -providerClass sun.security.pkcs11.SunPKCS11 \ -providerArg /foo/bar/token.config \ -list-providerName
providerNamejava.security セキュリティープロパティーファイル内で 2 つ以上のプロバイダが設定されている場合、-providerName オプションを使って特定のプロバイダインスタンスを選択できます。このオプションの引数は、プロバイダの名前です。 Sun PKCS#11 プロバイダの場合、providerName は SunPKCS11-TokenName という形式になります。 ここで「TokenName」は、プロバイダインスタンスが構成された名前の接尾辞です。 詳細は構成属性の表を参照してください。たとえば、以下のコマンドでは、名前接尾辞 SmartCard の PKCS#11 キーストアプロバイダインスタンスの内容をリストします。
jarsigner -keystore NONE -storetype PKCS11 \ -providerName SunPKCS11-SmartCard \ -list-J
javaoption指定された javaoption 文字列を Java インタプリタに直接渡します。(jarsigner は、実際には Java インタプリタに対する「ラッパー」です。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタオプションを一覧表示するには、コマンド行で java -h
またはjava -X
と入力してください。-tsa
urlJAR ファイルの署名時にコマンド行に「 -tsa http://example.tsa.url
」が表示される場合、署名のタイムスタンプが生成されます。URLhttp://example.tsa.url
は、TSA (Time Stamping Authority) の場所を特定します。これは、-tsacert
オプションで検出された URL をオーバーライドします。-tsa
オプションでは、TSA の公開鍵証明書をキーストアに配置する必要はありません。タイムスタンプを生成するため、
jarsigner
は RFC 3161 で定義されている TSP (Time-Stamp Protocol) を使用して TSA と通信します。成功すると、TSA から返されたタイムスタンプトークンは署名ブロックファイルの署名とともに保存されます。-tsacert
aliasJAR ファイルの署名時にコマンド行に「 -tsacert alias
」が表示される場合、署名のタイムスタンプが生成されます。alias
は、キーストア内の現在有効な TSA の公開鍵証明書を特定します。エントリの証明書で、TSA の場所を特定する URL を含む Subject Information Access 拡張機能が確認されます。TSA の公開鍵証明書は、
-tsacert
を使った場合、キーストアに配置されている必要があります。-altsigner
class代替署名機構を使用することを指定します。完全修飾クラス名は、 com.sun.jarsigner.ContentSigner
の abstract クラスを拡張するクラスファイルを特定します。このクラスファイルへのパスは、-altsignerpath
オプションによって定義されます。-altsigner
オプションを使用した場合、jarsigner
は指定されたクラスが提供する署名機構を使用します。または、jarsigner
はデフォルトの署名機構を使用します。たとえば、
com.sun.sun.jarsigner.AuthSigner
というクラスが提供する署名機構を使用するには、jarsigner
オプション「-altsigner com.sun.jarsigner.AuthSigner
」を使用します。-altsignerpath
classpathlistクラスファイル (クラスファイル名は上記のように -altsigner
オプションで指定される) およびそれが依存する JAR ファイルへのパスを指定します。クラスファイルが JAR ファイル内にある場合、以下の例のように JAR ファイルへのパスが指定されます。絶対パスまたは現在のディレクトリからの相対パスを指定できます。
classpathlist
には、複数のパスまたは JAR ファイルを含めることができます。 その場合、各パスまたは JAR ファイルを、Solaris の場合にはコロン (:
)、Windows の場合にはセミコロン (;
) で区切ります。目的のクラスがすでに検索パス内にある場合は、このオプションは不要です。クラスファイルを含む、JAR ファイルへのパスを指定する例を示します。
-altsignerpath /home/user/lib/authsigner.jar
JAR ファイル名が含まれていることに注意してください。
クラスファイルを含む JAR ファイルへのパスを指定する例を示します。
-altsignerpath /home/user/classes/com/sun/tools/jarsigner/
JAR ファイル名は含まれていないことに留意してください。
JAR ファイルの署名
bundle.jar という名前の JAR ファイルがあるとします。 このファイルに、キーストアの別名が jane であるユーザーの非公開鍵を使って、署名を付けるとします。キーストアは、mystore という名前で、C ドライブの working ディレクトリにあり、キーストアのパスワードは mypass、jane の非公開鍵のパスワードは j638klm とします。この場合、次のコマンドを実行すると、JAR ファイルに署名を付けて sbundle.jar という署名付き JAR ファイルを作成できます。
jarsigner -keystore /working/mystore -storepass myspass -keypass j638klm -signedjar sbundle.jar bundle.jar jane上のコマンドでは
-sigfile
オプションが指定されていないため、署名付き JAR ファイルに格納される .SF ファイルと .DSA ファイルの名前は、別名からデフォルト名がつけられます。つまり、JANE.SF
とJANE.DSA
になります。ストアのパスワードと非公開鍵のパスワードをあとで入力する場合は、上のコマンドを短縮して次のように入力できます。
jarsigner -keystore /working/mystore -signedjar sbundle.jar bundle.jar janeデフォルトのキーストア (ホームディレクトリ内の .keystore という名前のキーストア) を使用する場合は、次に示すように、キーストアの指定を省略できます。
jarsigner -signedjar sbundle.jar bundle.jar janeまた、署名付き JAR ファイルで入力 JAR ファイル (
bundle.jar
) を上書きする場合は、-signedjar
オプションの指定も省略できます。jarsigner bundle.jar jane署名付き JAR ファイルの検証
次に示すのは、署名付き JAR ファイルを検証し、署名が有効で JAR ファイルが改変されていないことを確認するためのコマンド例です。
jarsigner -verify sbundle.jar検証が成功すると、次のようなメッセージが表示されます。
jar が検証されました。というメッセージが表示されます。検証が成功しなかった場合は、エラーメッセージが表示されます。
-verbose
オプションを使うと、より多くの情報が表示されます。次に示すのは、-verbose
オプションを指定した jarsigner の実行例とその出力結果です。jarsigner -verify -verbose sbundle.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx.class smk 849 Fri Sep 26 16:12:46 PDT 1997 test.class s = 署名が検証されました。 m = エントリがマニフェスト内にリストされます。 k = 1 つ以上の証明書がキーストアで検出されました。 jar が検証されました。証明書情報を使った検証
検証時に、
-verify
と-verbose
オプションに加えて-certs
オプションを指定した場合は、JAR ファイル内の各署名者の証明書情報も出力されます。 これには、証明書のタイプ、署名者の識別名情報 (X.509 証明書の場合)、および JAR ファイルの公開鍵の証明書がキーストアエントリの公開鍵の証明書と一致する場合には、括弧で囲まれた署名者のキーストア別名が含まれます。次に例を示します。jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 208 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.SF 1087 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst.class X.509, CN=Test Group, OU=Java Software, O=Sun Microsystems, L=CUP, S=CA, C=US (javatest) X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) s = 署名が検証されました。 m = エントリがマニフェスト内にリストされます。 k = 1 つ以上の証明書がキーストアで検出されました。 jar が検証されました。署名者の証明書が X.509 証明書でない場合は、識別名情報は表示されません。その場合には、証明書のタイプと別名だけが表示されます。たとえば、証明書が PGP 証明書で、別名が bob の場合は、次のように表示されます。
PGP, (bob)アイデンティティーデータベースの署名者を含む JAR ファイルの検証
JAR ファイルが、JDK 1.1 の javakey ツールを使って署名されている場合、署名者はアイデンティティーデータベース内の別名です。 この場合、検証の出力には i という記号が含まれます。JAR ファイルが、アイデンティティーデータベース内の別名とキーストア内の別名の両方によって署名されている場合は、k と i の両方が表示されます。
-certs
オプションを指定した場合、キーストアの別名は括弧で囲まれるのに対し、アイデンティティーデータベース内の別名は角括弧で囲まれて表示されます。例を示します。jarsigner -keystore /working/mystore -verify -verbose -certs writeFile.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 199 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.SF 1013 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.DSA smki 2752 Fri Sep 26 16:12:30 PDT 1997 writeFile.html X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) X.509, CN=Duke, OU=Java Software, O=Sun, L=cup, S=ca, C=us [duke] s = 署名が検証されました。 m = エントリがマニフェスト内にリストされます。 k = 1 つ以上の証明書がキーストアで検出されました。 i = 1 つ以上の証明書がアイデンティティースコープで検出されました。 jar が検証されました。別名 duke は角括弧で囲まれているので、この別名はキーストアの別名ではなく、アイデンティティーデータベースの別名です。
- jar ツールのドキュメント
- keytool ツールのドキュメント
- jarsigner ツールの使用例については、「Java Tutorial」の「Security」を参照
Copyright © 2004-2006 Sun Microsystems, Inc. All Rights Reserved. |
Java Software |